package integer;

import object.Point;

/**
 * JDK5之后,java推出了一个新特性:自动拆装箱
 * 该特性允许我们在源代码中直接将基本类型和对应的包装类互相赋值,编译器会在编译期间自动添加类型转换操作
 * 这个过程称为自动拆装箱
 */
public class IntegerDemo3 {
    public static void main(String[] args) {
        int a = 1;
        /*
            将基本类型直接赋值给引用类型,这实际上触发了编译器的自动装箱特性
            自动装箱:
            当编译器发现我们将基本类型值赋值给引用类型时,编译器在编译时会补充将基本类型转换为
            对应包装类的操作
            Integer i = a;
            会被编译器改为:
            Integer i = Integer.valueOf(a);
         */
        Integer i = a;
        /*
            触发了自动拆箱特性
            编译器会将代码改为:
            a = i.intValue();
         */
        a = i;


        /*
            开发中使用到包装类的地方
         */
        //JDK5之前,这样写编译会报错,因为int类型没有继承Object,因此该多态用法不成立
        Object o = 123;//在JDK5之后会触发自动装箱:Object o = Integer.valueOf(123);


        Object[] arr = new Object[3];
        arr[0] = "abc";//可以,因为String继承自Object
        arr[1] = new Point(1,2);//可以,因为Point也继承自Object
        arr[2] = 123;//本身不可以,但是触发自动装箱:arr[2] = Integer.valueOf(123);
    }
}
